package annuaire.rmi.remotedObject;

/**
 * 
 */

import java.rmi.Remote;
import java.rmi.RemoteException;
import java.util.Collection;

import annuaire.beans.Admin;
import annuaire.beans.Promotion;
import annuaire.beans.Student;
import annuaire.exceptions.BusinessException;

/**
 * Interface d'objet distant RMI, servant à gérer l'authentification, ainsi que
 * les service de lecture seulement
 * 
 * @author Yannick Lorenzati & Stephanie Malakian
 * 
 */
public interface IRemotedAnnuaire extends Remote {

	public static final String roleStudent = "student";
	public static final String roleAdmin = "admin";
	public static final String roleAnonymous = "anonymous";

	/** Gestion de l'authentification */

	/**
	 * Permet de s'authentifier sur l'annuaire.
	 * 
	 * @param login
	 *            Le login de l'utilisateur.
	 * @param pwd
	 *            Le mot de passe de l'utilisateur.
	 * @return Un utilisateur, ou NULL si l'authentification a echoué.
	 * @throws RemoteException
	 * @throws BusinessException
	 */
	public IRemotedUser login(String login, String pwd) throws RemoteException,
			BusinessException;

	/**
	 * Renvoie le mot de passe d'un utilisateur par mail.
	 * 
	 * @param login
	 *            Le login de l'utilisateur.
	 * @throws RemoteException
	 * @throws BusinessException
	 */
	public void getPwdByEmail(String login) throws RemoteException,
			BusinessException;

	/** fonctionnalites accessibles à tous */

	/**
	 * Renvoie une liste d'id des promotions.
	 * 
	 * @return Une collection d'id de promotions.
	 * @throws RemoteException
	 * @throws BusinessException
	 */
	public Collection<Integer> findAllPromosId() throws RemoteException,
			BusinessException;

	/**
	 * Permet d'obtenir une promotion à partir de son id.
	 * 
	 * @param id
	 *            Id de la promotion.
	 * @param withStudents
	 *            Booléen indiquant si le résultat doit renvoyer la promotion
	 *            uniquement (withStudents vaut false) ou bien la promotion
	 *            ainsi que les étudiants qui en font partie (withStudents vaut
	 *            true).
	 * @return La promotion dont l'id est passé en argument.
	 * @throws RemoteException
	 * @throws BusinessException
	 */
	public Promotion findPromoById(int id, boolean withStudents)
			throws RemoteException, BusinessException;

	/**
	 * Recherche les nbResult premières promotions qui correspondent au pattern.
	 * 
	 * @param pattern
	 *            Promotion servant de modèle de recherche.
	 * @param withStudents
	 *            Booléen indiquant si le résultat doit renvoyer la promotion
	 *            uniquement (withStudents vaut false) ou bien la promotion
	 *            ainsi que les étudiants qui en font partie (withStudents vaut
	 *            true).
	 * @param nbResult
	 *            Nombre entier indiquant le nombre maximum de résultats
	 *            retournés.
	 * @return L'ensemble des promotions qui correspondent au pattern.
	 * @throws RemoteException
	 * @throws BusinessException
	 */
	public Collection<Promotion> searchPromo(Promotion pattern,
			boolean withStudents, Integer nbResult) throws RemoteException,
			BusinessException;

	/**
	 * Recherche la première promotion qui corresponde au pattern.
	 * 
	 * @param pattern
	 *            Promotion servant de modèle de recherche.
	 * @param withStudents
	 *            Booléen indiquant si le résultat doit renvoyer la promotion
	 *            uniquement (withStudents vaut false) ou bien la promotion
	 *            ainsi que les étudiants qui en font partie (withStudents vaut
	 *            true).
	 * @return La première promotion qui corresponde au pattern.
	 * @throws RemoteException
	 * @throws BusinessException
	 */
	public Promotion searchOnePromo(Promotion pattern, boolean withStudents)
			throws RemoteException, BusinessException;

	/**
	 * Renvoie La liste des id des étudiants.
	 * 
	 * @return La liste des id des étudiants.
	 * @throws RemoteException
	 * @throws BusinessException
	 */
	public Collection<Integer> findAllStudentsId() throws RemoteException,
			BusinessException;

	/**
	 * Renvoie la liste des id des etudiants qui font partie de la promotion
	 * demandée.
	 * 
	 * @param id
	 *            Id de la promotion.
	 * @return La liste des id des étudiants qui font partie de la promotion
	 *         demandée.
	 * @throws RemoteException
	 * @throws BusinessException
	 */

	public Collection<Integer> findAllStudentsIdByPromo(int id)
			throws RemoteException, BusinessException;

	/**
	 * Renvoie un Student à partir de son id.
	 * 
	 * @param id
	 *            Id de l'étudiant.
	 * @return L'étudiant dont l'id est passé en paramètre.
	 * @throws RemoteException
	 * @throws BusinessException
	 */
	public Student findStudentById(int id) throws RemoteException,
			BusinessException;

	/**
	 * Recherche les nbResult premiers Student qui correspondent au pattern.
	 * 
	 * @param pattern
	 *            Etudiant servant de modèle de recherche.
	 * @param nbResult
	 *            Nombre entier indiquant le nombre maximum de résultats
	 *            retournés.
	 * @return Les étudiants qui correspondent au pattern.
	 * @throws RemoteException
	 * @throws BusinessException
	 */
	public Collection<Student> searchStudent(Student pattern, Integer nbResult)
			throws RemoteException, BusinessException;

	/**
	 * Recherche le premier étudiant qui corresponde au pattern.
	 * 
	 * @param pattern
	 *            Etudiant servant de modèle de recherche.
	 * @return Le premier étudiant qui corresponde au pattern.
	 * @throws RemoteException
	 * @throws BusinessException
	 */
	public Student searchOneStudent(Student pattern) throws RemoteException,
			BusinessException;

	/**
	 * Recherche les nbResult premiers administrateurs qui corresponde au
	 * pattern
	 * 
	 * @param pattern
	 *            Administateur servant de modèle de recherche.
	 * @param nbResult
	 *            Nombre entier indiquant le nombre maximum de résultats
	 *            retournés.
	 * @return Les administrateurs qui correspondent au pattern.
	 * @throws RemoteException
	 * @throws BusinessException
	 */
	public Collection<Admin> searchAdmin(Admin pattern, Integer nbResult)
			throws RemoteException, BusinessException;

	/**
	 * Recherche le premier administrateur qui corresponde au pattern.
	 * 
	 * @param pattern
	 *            Administateur servant de modèle de recherche.
	 * @return Le premier administrateur qui corresponde au pattern.
	 * @throws RemoteException
	 * @throws BusinessException
	 */
	public Admin searchOneAdmin(Admin pattern) throws RemoteException,
			BusinessException;
}
